home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / var / lib / dpkg / info / x11-common.config < prev    next >
Text File  |  2009-10-19  |  30KB  |  942 lines

  1. #!/bin/sh
  2. # Debian x11-common package configuration script
  3. # Copyright 2000--2003 Branden Robinson.
  4. # Licensed under the GNU General Public License, version 2.  See the file
  5. # /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
  6.  
  7. set -e
  8.  
  9. # source debconf library
  10. . /usr/share/debconf/confmodule
  11.  
  12. THIS_PACKAGE=x11-common
  13. THIS_SCRIPT=config
  14.  
  15. # $Id$
  16.  
  17. # This is the X Strike Force shell library for X Window System package
  18. # maintainer scripts.  It serves to define shell functions commonly used by
  19. # such packages, and performs some error checking necessary for proper operation
  20. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  21. # invoke the functions defined here to accomplish package installation and
  22. # removal tasks.
  23.  
  24. # If you are reading this within a Debian package maintainer script (e.g.,
  25. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  26. # skip past this library by scanning forward in this file to the string
  27. # "GOBSTOPPER".
  28.  
  29. SOURCE_VERSION=1:7.4+3ubuntu7
  30. OFFICIAL_BUILD=
  31.  
  32. # Use special abnormal exit codes so that problems with this library are more
  33. # easily tracked down.
  34. SHELL_LIB_INTERNAL_ERROR=86
  35. SHELL_LIB_THROWN_ERROR=74
  36. SHELL_LIB_USAGE_ERROR=99
  37.  
  38. # old -> new variable names
  39. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  40.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  41. fi
  42. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  43.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  44. fi
  45.  
  46. # initial sanity checks
  47. if [ -z "$THIS_PACKAGE" ]; then
  48.   cat >&2 <<EOF
  49. Error: package maintainer script attempted to use shell library without
  50. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  51. version, and the text of this error message to the Debian Bug Tracking System.
  52. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  53. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  54. "doc-debian" package, or install the "reportbug" package and use the command of
  55. the same name to file a report against version $SOURCE_VERSION of this package.
  56. EOF
  57.   exit $SHELL_LIB_USAGE_ERROR
  58. fi
  59.  
  60. if [ -z "$THIS_SCRIPT" ]; then
  61.   cat >&2 <<EOF
  62. Error: package maintainer script attempted to use shell library without
  63. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  64. version, and the text of this error message to the Debian Bug Tracking System.
  65. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  66. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  67. "doc-debian" package, or install the "reportbug" package and use the command of
  68. the same name to file a report against version $SOURCE_VERSION of the
  69. "$THIS_PACKAGE" package.
  70. EOF
  71.   exit $SHELL_LIB_USAGE_ERROR
  72. fi
  73.  
  74. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  75.   RECONFIGURE="true"
  76. else
  77.   RECONFIGURE=
  78. fi
  79.  
  80. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  81.   FIRSTINST="yes"
  82. fi
  83.  
  84. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  85.   UPGRADE="yes"
  86. fi
  87.  
  88. trap "message;\
  89.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  90.       message;\
  91.       exit 1" HUP INT QUIT TERM
  92.  
  93. reject_nondigits () {
  94.   # syntax: reject_nondigits [ operand ... ]
  95.   #
  96.   # scan operands (typically shell variables whose values cannot be trusted) for
  97.   # characters other than decimal digits and barf if any are found
  98.   while [ -n "$1" ]; do
  99.     # does the operand contain anything but digits?
  100.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  101.       # can't use die(), because it wraps message() which wraps this function
  102.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  103.            "possibly malicious garbage \"$1\"" >&2
  104.       exit $SHELL_LIB_THROWN_ERROR
  105.     fi
  106.     shift
  107.   done
  108. }
  109.  
  110. reject_whitespace () {
  111.   # syntax: reject_whitespace [ operand ]
  112.   #
  113.   # scan operand (typically a shell variable whose value cannot be trusted) for
  114.   # whitespace characters and barf if any are found
  115.   if [ -n "$1" ]; then
  116.     # does the operand contain any whitespace?
  117.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  118.       # can't use die(), because I want to avoid forward references
  119.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  120.            "possibly malicious garbage \"$1\"" >&2
  121.       exit $SHELL_LIB_THROWN_ERROR
  122.     fi
  123.   fi
  124. }
  125.  
  126. reject_unlikely_path_chars () {
  127.   # syntax: reject_unlikely_path_chars [ operand ... ]
  128.   #
  129.   # scan operands (typically shell variables whose values cannot be trusted) for
  130.   # characters unlikely to be seen in a path and which the shell might
  131.   # interpret and barf if any are found
  132.   while [ -n "$1" ]; do
  133.     # does the operand contain any funny characters?
  134.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  135.       # can't use die(), because I want to avoid forward references
  136.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  137.            "encountered possibly malicious garbage \"$1\"" >&2
  138.       exit $SHELL_LIB_THROWN_ERROR
  139.     fi
  140.     shift
  141.   done
  142. }
  143.  
  144. # Query the terminal to establish a default number of columns to use for
  145. # displaying messages to the user.  This is used only as a fallback in the
  146. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  147. # the script is running, and this cannot, only being calculated once.)
  148. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  149. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  150.   DEFCOLUMNS=80
  151. fi
  152.  
  153. message () {
  154.   # pretty-print messages of arbitrary length
  155.   reject_nondigits "$COLUMNS"
  156.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  157. }
  158.  
  159. observe () {
  160.   # syntax: observe message ...
  161.   #
  162.   # issue observational message suitable for logging someday when support for
  163.   # it exists in dpkg
  164.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  165.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  166.   fi
  167. }
  168.  
  169. warn () {
  170.   # syntax: warn message ...
  171.   #
  172.   # issue warning message suitable for logging someday when support for
  173.   # it exists in dpkg; also send to standard error
  174.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  175. }
  176.  
  177. die () {
  178.   # syntax: die message ...
  179.   #
  180.   # exit script with error message
  181.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  182.   exit $SHELL_LIB_THROWN_ERROR
  183. }
  184.  
  185. internal_error () {
  186.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  187.   message "internal error: $*"
  188.   if [ -n "$OFFICIAL_BUILD" ]; then
  189.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  190.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  191.             "Tracking System.  Include all messages above that mention the" \
  192.             "$THIS_PACKAGE package.  Visit " \
  193.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  194.             "instructions, read the file" \
  195.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  196.             "package, or install the reportbug package and use the command of" \
  197.             "the same name to file a report."
  198.   fi
  199.   exit $SHELL_LIB_INTERNAL_ERROR
  200. }
  201.  
  202. usage_error () {
  203.   message "usage error: $*"
  204.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  205.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  206.           "Tracking System.  Include all messages above that mention the" \
  207.           "$THIS_PACKAGE package.  Visit " \
  208.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  209.           "instructions, read the file" \
  210.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  211.           "package, or install the reportbug package and use the command of" \
  212.           "the same name to file a report."
  213.   exit $SHELL_LIB_USAGE_ERROR
  214. }
  215.  
  216.  
  217. maplink () {
  218.   # returns what symlink should point to; i.e., what the "sane" answer is
  219.   # Keep this in sync with the debian/*.links files.
  220.   # This is only needed for symlinks to directories.
  221.   #
  222.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  223.   # If we've stopped using this function, fixing it might enable us to re-enable
  224.   # it again and catch more errors.
  225.   case "$1" in
  226.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  227.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  228.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  229.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  230.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  231.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  232.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  233.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  234.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  235.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  236.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  237.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  238.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  239.     /usr/bin/X11) echo ../X11R6/bin ;;
  240.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  241.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  242.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  243.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  244.   esac
  245. }
  246.  
  247. analyze_path () {
  248.   # given a supplied set of pathnames, break each one up by directory and do an
  249.   # ls -dl on each component, cumulatively; i.e.
  250.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  251.   # Thanks to Randolph Chung for this clever hack.
  252.  
  253.   local f g
  254.  
  255.   while [ -n "$1" ]; do
  256.     reject_whitespace "$1"
  257.     g=
  258.     message "Analyzing $1:"
  259.     for f in $(echo "$1" | tr / \  ); do
  260.       if [ -e /$g$f ]; then
  261.         ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
  262.         g=$g$f/
  263.       else
  264.         message "/$g$f: nonexistent; directory contents of /$g:"
  265.         ls -l /$g
  266.         break
  267.       fi
  268.     done
  269.     shift
  270.   done
  271. }
  272.  
  273. find_culprits () {
  274.   local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  275.     msg
  276.  
  277.   reject_whitespace "$1"
  278.   message "Searching for overlapping packages..."
  279.   dpkg_info_dir=/var/lib/dpkg/info
  280.   if [ -d $dpkg_info_dir ]; then
  281.     if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
  282.       possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
  283.         "(xbase-clients|x11-common|xfs|xlibs)")
  284.       if [ -n "$possible_culprits" ]; then
  285.         smoking_guns=$(grep -l "$1" $possible_culprits || true)
  286.         if [ -n "$smoking_guns" ]; then
  287.           bad_packages=$(printf "\\n")
  288.           for f in $smoking_guns; do
  289.             # too bad you can't nest parameter expansion voodoo
  290.             p=${f%*.list}      # strip off the trailing ".list"
  291.             package=${p##*/}   # strip off the directories
  292.             bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
  293.           done
  294.           msg=$(cat <<EOF
  295. The following packages appear to have file overlaps with the X.Org packages;
  296. these packages are either very old, or in violation of Debian Policy.  Try
  297. upgrading each of these packages to the latest available version if possible:
  298. for example, with the command "apt-get install".  If no newer version of a
  299. package is available, you will have to remove it; for example, with the command
  300. "apt-get remove".  If even the latest available version of the package has
  301. this file overlap, please file a bug against that package with the Debian Bug
  302. Tracking System.  You may want to refer the package maintainer to section 12.8
  303. of the Debian Policy manual.
  304. EOF
  305. )
  306.           message "$msg"
  307.           message "The overlapping packages are: $bad_packages"
  308.         else
  309.           message "no overlaps found."
  310.         fi
  311.       fi
  312.     else
  313.       message "cannot search; no matches for $dpkg_info_dir/*.list."
  314.     fi
  315.   else
  316.     message "cannot search; $dpkg_info_dir does not exist."
  317.   fi
  318. }
  319.  
  320. check_symlink () {
  321.   # syntax: check_symlink symlink
  322.   #
  323.   # See if specified symlink points where it is supposed to.  Return 0 if it
  324.   # does, and 1 if it does not.
  325.   #
  326.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  327.  
  328.   local symlink
  329.  
  330.   # validate arguments
  331.   if [ $# -ne 1 ]; then
  332.     usage_error "check_symlink() called with wrong number of arguments;" \
  333.                 "expected 1, got $#"
  334.     exit $SHELL_LIB_USAGE_ERROR
  335.   fi
  336.  
  337.   symlink="$1"
  338.  
  339.   if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
  340.     return 0
  341.   else
  342.     return 1
  343.   fi
  344. }
  345.  
  346. check_symlinks_and_warn () {
  347.   # syntax: check_symlinks_and_warn symlink ...
  348.   #
  349.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  350.   #
  351.   # Call this function from a preinst script in the event $1 is "upgrade" or
  352.   # "install".
  353.  
  354.   local errmsg symlink
  355.  
  356.   # validate arguments
  357.   if [ $# -lt 1 ]; then
  358.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  359.                 "arguments; expected at least 1, got $#"
  360.     exit $SHELL_LIB_USAGE_ERROR
  361.   fi
  362.  
  363.   while [ -n "$1" ]; do
  364.     symlink="$1"
  365.     if [ -L "$symlink" ]; then
  366.       if ! check_symlink "$symlink"; then
  367.         observe "$symlink symbolic link points to wrong location" \
  368.                 "$(readlink "$symlink"); removing"
  369.         rm "$symlink"
  370.       fi
  371.     elif [ -e "$symlink" ]; then
  372.       errmsg="$symlink exists and is not a symbolic link; this package cannot"
  373.       errmsg="$errmsg be installed until this"
  374.       if [ -f "$symlink" ]; then
  375.         errmsg="$errmsg file"
  376.       elif [ -d "$symlink" ]; then
  377.         errmsg="$errmsg directory"
  378.       else
  379.         errmsg="$errmsg thing"
  380.       fi
  381.       errmsg="$errmsg is removed"
  382.       die "$errmsg"
  383.     fi
  384.     shift
  385.   done
  386. }
  387.  
  388. check_symlinks_and_bomb () {
  389.   # syntax: check_symlinks_and_bomb symlink ...
  390.   #
  391.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  392.   #
  393.   # Call this function from a postinst script.
  394.  
  395.   local problem symlink
  396.  
  397.   # validate arguments
  398.   if [ $# -lt 1 ]; then
  399.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  400.                 "arguments; expected at least 1, got $#"
  401.     exit $SHELL_LIB_USAGE_ERROR
  402.   fi
  403.  
  404.   while [ -n "$1" ]; do
  405.     problem=
  406.     symlink="$1"
  407.     if [ -L "$symlink" ]; then
  408.       if ! check_symlink "$symlink"; then
  409.         problem=yes
  410.         warn "$symlink symbolic link points to wrong location" \
  411.              "$(readlink "$symlink")"
  412.       fi
  413.     elif [ -e "$symlink" ]; then
  414.       problem=yes
  415.       warn "$symlink is not a symbolic link"
  416.     else
  417.       problem=yes
  418.       warn "$symlink symbolic link does not exist"
  419.     fi
  420.     if [ -n "$problem" ]; then
  421.       analyze_path "$symlink" "$(readlink "$symlink")"
  422.       find_culprits "$symlink"
  423.       die "bad symbolic links on system"
  424.     fi
  425.     shift
  426.   done
  427. }
  428.  
  429. font_update () {
  430.   # run $UPDATECMDS in $FONTDIRS
  431.  
  432.   local dir cmd shortcmd x_font_dir_prefix
  433.  
  434.   x_font_dir_prefix="/usr/share/fonts/X11"
  435.  
  436.   if [ -z "$UPDATECMDS" ]; then
  437.     usage_error "font_update() called but \$UPDATECMDS not set"
  438.   fi
  439.   if [ -z "$FONTDIRS" ]; then
  440.     usage_error "font_update() called but \$FONTDIRS not set"
  441.   fi
  442.  
  443.   reject_unlikely_path_chars "$UPDATECMDS"
  444.   reject_unlikely_path_chars "$FONTDIRS"
  445.  
  446.   for dir in $FONTDIRS; do
  447.     if [ -d "$x_font_dir_prefix/$dir" ]; then
  448.       for cmd in $UPDATECMDS; do
  449.         if which "$cmd" > /dev/null 2>&1; then
  450.           shortcmd=${cmd##*/}
  451.           observe "running $shortcmd in $dir font directory"
  452.       cmd_opts=
  453.           if [ "$shortcmd" = "update-fonts-alias" ]; then
  454.             cmd_opts=--x11r7-layout
  455.           fi
  456.           if [ "$shortcmd" = "update-fonts-dir" ]; then
  457.             cmd_opts=--x11r7-layout
  458.           fi
  459.           if [ "$shortcmd" = "update-fonts-scale" ]; then
  460.             cmd_opts=--x11r7-layout
  461.           fi
  462.           $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \
  463.                               "failed; font directory data may not" \
  464.                               "be up to date"
  465.         else
  466.           warn "$cmd not found; not updating corresponding $dir font" \
  467.                "directory data"
  468.         fi
  469.       done
  470.     else
  471.       warn "$dir is not a directory; not updating font directory data"
  472.     fi
  473.   done
  474. }
  475.  
  476. remove_conffile_prepare () {
  477.   # syntax: remove_conffile_prepare filename official_md5sum ...
  478.   #
  479.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  480.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  481.   # operands provided, then prepare the conffile for removal from the system.
  482.   # We defer actual deletion until the package is configured so that we can
  483.   # roll this operation back if package installation fails.
  484.   #
  485.   # Call this function from a preinst script in the event $1 is "upgrade" or
  486.   # "install" and verify $2 to ensure the package is being upgraded from a
  487.   # version (or installed over a version removed-but-not-purged) prior to the
  488.   # one in which the conffile was obsoleted.
  489.  
  490.   local conffile current_checksum
  491.  
  492.   # validate arguments
  493.   if [ $# -lt 2 ]; then
  494.     usage_error "remove_conffile_prepare() called with wrong number of" \
  495.                 "arguments; expected at least 2, got $#"
  496.     exit $SHELL_LIB_USAGE_ERROR
  497.   fi
  498.  
  499.   conffile="$1"
  500.   shift
  501.  
  502.   # does the conffile even exist?
  503.   if [ -e "$conffile" ]; then
  504.     # calculate its checksum
  505.     current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//')
  506.     # compare it to each supplied checksum
  507.     while [ -n "$1" ]; do
  508.       if [ "$current_checksum" = "$1" ]; then
  509.         # we found a match; move the confffile and stop looking
  510.         observe "preparing obsolete conffile $conffile for removal"
  511.         mv "$conffile" "$conffile.$THIS_PACKAGE-tmp"
  512.         break
  513.       fi
  514.       shift
  515.     done
  516.   fi
  517. }
  518.  
  519. remove_conffile_lookup () {
  520.   # syntax: remove_conffile_lookup package filename
  521.   #
  522.   # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal
  523.   # if it matches the actual file's md5sum.
  524.   #
  525.   # Call this function when you would call remove_conffile_prepare but only
  526.   # want to check against dpkg's status database instead of known checksums.
  527.  
  528.   local package conffile old_md5sum
  529.  
  530.   # validate arguments
  531.   if [ $# -ne 2 ]; then
  532.     usage_error "remove_conffile_lookup() called with wrong number of" \
  533.                 "arguments; expected 1, got $#"
  534.     exit $SHELL_LIB_USAGE_ERROR
  535.   fi
  536.  
  537.   package="$1"
  538.   conffile="$2"
  539.  
  540.   if ! [ -e "$conffile" ]; then
  541.     return
  542.   fi
  543.   old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \
  544.     awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')"
  545.   if [ -n "$old_md5sum" ]; then
  546.     remove_conffile_prepare "$conffile" "$old_md5sum"
  547.   fi
  548. }
  549.  
  550. remove_conffile_commit () {
  551.   # syntax: remove_conffile_commit filename
  552.   #
  553.   # Complete the removal of a conffile "filename" that has become obsolete.
  554.   #
  555.   # Call this function from a postinst script after having used
  556.   # remove_conffile_prepare() in the preinst.
  557.  
  558.   local conffile
  559.  
  560.   # validate arguments
  561.   if [ $# -ne 1 ]; then
  562.     usage_error "remove_conffile_commit() called with wrong number of" \
  563.                 "arguments; expected 1, got $#"
  564.     exit $SHELL_LIB_USAGE_ERROR
  565.   fi
  566.  
  567.   conffile="$1"
  568.  
  569.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  570.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  571.     observe "committing removal of obsolete conffile $conffile"
  572.     rm "$conffile.$THIS_PACKAGE-tmp"
  573.   fi
  574. }
  575.  
  576. remove_conffile_rollback () {
  577.   # syntax: remove_conffile_rollback filename
  578.   #
  579.   # Roll back the removal of a conffile "filename".
  580.   #
  581.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  582.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  583.   # preinst.
  584.  
  585.   local conffile
  586.  
  587.   # validate arguments
  588.   if [ $# -ne 1 ]; then
  589.     usage_error "remove_conffile_rollback() called with wrong number of" \
  590.                 "arguments; expected 1, got $#"
  591.     exit $SHELL_LIB_USAGE_ERROR
  592.   fi
  593.  
  594.   conffile="$1"
  595.  
  596.   # if the temporary file created by remove_conffile_prepare() exists, move it
  597.   # back
  598.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  599.     observe "rolling back removal of obsolete conffile $conffile"
  600.     mv "$conffile.$THIS_PACKAGE-tmp" "$conffile"
  601.   fi
  602. }
  603.  
  604. replace_conffile_with_symlink_prepare () {
  605.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  606.   # official_md5sum ...
  607.   #
  608.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  609.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  610.   # operands provided, then prepare the conffile for removal from the system.
  611.   # We defer actual deletion until the package is configured so that we can
  612.   # roll this operation back if package installation fails. Otherwise copy it
  613.   # to newfilename and let dpkg handle it through conffiles mechanism.
  614.   #
  615.   # Call this function from a preinst script in the event $1 is "upgrade" or
  616.   # "install" and verify $2 to ensure the package is being upgraded from a
  617.   # version (or installed over a version removed-but-not-purged) prior to the
  618.   # one in which the conffile was obsoleted.
  619.  
  620.   local conffile current_checksum
  621.  
  622.   # validate arguments
  623.   if [ $# -lt 3 ]; then
  624.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  625.                 " number of arguments; expected at least 3, got $#"
  626.     exit $SHELL_LIB_USAGE_ERROR
  627.   fi
  628.  
  629.   oldconffile="$1"
  630.   shift
  631.   newconffile="$1"
  632.   shift
  633.  
  634.   remove_conffile_prepare "$_oldconffile" "$@"
  635.   # If $oldconffile still exists, then md5sums didn't match.
  636.   # Copy it to new one.
  637.   if [ -f "$oldconffile" ]; then
  638.     cp "$oldconffile" "$newconffile"
  639.   fi
  640.  
  641. }
  642.  
  643. replace_conffile_with_symlink_commit () {
  644.   # syntax: replace_conffile_with_symlink_commit oldfilename
  645.   #
  646.   # Complete the removal of a conffile "oldfilename" that has been
  647.   # replaced by a symlink.
  648.   #
  649.   # Call this function from a postinst script after having used
  650.   # replace_conffile_with_symlink_prepare() in the preinst.
  651.  
  652.   local conffile
  653.  
  654.   # validate arguments
  655.   if [ $# -ne 1 ]; then
  656.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  657.                 "number of arguments; expected 1, got $#"
  658.     exit $SHELL_LIB_USAGE_ERROR
  659.   fi
  660.  
  661.   conffile="$1"
  662.  
  663.   remove_conffile_commit "$conffile"
  664. }
  665.  
  666. replace_conffile_with_symlink_rollback () {
  667.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  668.   #
  669.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  670.   # "newfilename".
  671.   #
  672.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  673.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  674.   # from a version (or install over a version removed-but-not-purged) prior
  675.   # to the one in which the conffile was obsoleted.
  676.   # You should have  used replace_conffile_with_symlink_prepare() in the
  677.   # preinst.
  678.  
  679.   local conffile
  680.  
  681.   # validate arguments
  682.   if [ $# -ne 2 ]; then
  683.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  684.                 "number of arguments; expected 2, got $#"
  685.     exit $SHELL_LIB_USAGE_ERROR
  686.   fi
  687.  
  688.   oldconffile="$1"
  689.   newconffile="$2"
  690.  
  691.   remove_conffile_rollback "$_oldconffile"
  692.   if [ -f "$newconffile" ]; then
  693.     rm "$newconffile"
  694.   fi
  695. }
  696.  
  697. run () {
  698.   # syntax: run command [ argument ... ]
  699.   #
  700.   # Run specified command with optional arguments and report its exit status.
  701.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  702.   # or commands whose failure is not fatal to us.
  703.   #
  704.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  705.   # those cases the return value of the debconf command *must* be checked
  706.   # before the string returned by debconf is used for anything.
  707.  
  708.   local retval
  709.  
  710.   # validate arguments
  711.   if [ $# -lt 1 ]; then
  712.     usage_error "run() called with wrong number of arguments; expected at" \
  713.                 "least 1, got $#"
  714.     exit $SHELL_LIB_USAGE_ERROR
  715.   fi
  716.  
  717.   "$@" || retval=$?
  718.  
  719.   if [ ${retval:-0} -ne 0 ]; then
  720.     observe "command \"$*\" exited with status $retval"
  721.   fi
  722. }
  723.  
  724. make_symlink_sane () {
  725.   # syntax: make_symlink_sane symlink target
  726.   #
  727.   # Ensure that the symbolic link symlink exists, and points to target.
  728.   #
  729.   # If symlink does not exist, create it and point it at target.
  730.   #
  731.   # If symlink exists but is not a symbolic link, back it up.
  732.   #
  733.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  734.   # it.
  735.   #
  736.   # If symlink exists, is a symbolic link, and already points to target, do
  737.   # nothing.
  738.   #
  739.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  740.  
  741.   # Validate arguments.
  742.   if [ $# -ne 2 ]; then
  743.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  744.       "expected 2, got $#"
  745.     exit $SHELL_LIB_USAGE_ERROR
  746.   fi
  747.  
  748.   # We could just use the positional parameters as-is, but that makes things
  749.   # harder to follow.
  750.   local symlink target
  751.  
  752.   symlink="$1"
  753.   target="$2"
  754.  
  755.   if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
  756.       observe "link from $symlink to $target already exists"
  757.   else
  758.     observe "creating symbolic link from $symlink to $target"
  759.     mkdir -p "${target%/*}" "${symlink%/*}"
  760.     ln -s -b -S ".dpkg-old" "$target" "$symlink"
  761.   fi
  762. }
  763.  
  764. migrate_dir_to_symlink () {
  765.   # syntax: migrate_dir_to_symlink old_location new_location
  766.   #
  767.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  768.   # symbolic link to a directory or vice versa; instead, the existing state
  769.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  770.   # there is one."
  771.   #
  772.   # We have to do it ourselves.
  773.   #
  774.   # This function moves the contents of old_location, a directory, into
  775.   # new_location, a directory, then makes old_location a symbolic link to
  776.   # new_location.
  777.   #
  778.   # old_location need not exist, but if it does, it must be a directory (or a
  779.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  780.   # exists already and is not a directory, it is backed up.
  781.   #
  782.   # This function should be called from a package's preinst so that other
  783.   # packages unpacked after this one --- but before this package's postinst runs
  784.   # --- are unpacked into new_location even if their payloads contain
  785.   # old_location filespecs.
  786.  
  787.   # Validate arguments.
  788.   if [ $# -ne 2 ]; then
  789.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  790.                 "arguments; expected 2, got $#"
  791.     exit $SHELL_LIB_USAGE_ERROR
  792.   fi
  793.  
  794.   # We could just use the positional parameters as-is, but that makes things
  795.   # harder to follow.
  796.   local new old
  797.  
  798.   old="$1"
  799.   new="$2"
  800.  
  801.   # Is old location a symlink?
  802.   if [ -L "$old" ]; then
  803.     # Does it already point to new location?
  804.     if [ "$(readlink "$old")" = "$new" ]; then
  805.       # Nothing to do; migration has already been done.
  806.       observe "migration of $old to $new already done"
  807.       return 0
  808.     else
  809.       # Back it up.
  810.       warn "backing up symbolic link $old as $old.dpkg-old"
  811.       mv -b "$old" "$old.dpkg-old"
  812.     fi
  813.   fi
  814.  
  815.   # Does old location exist, but is not a directory?
  816.   if [ -e "$old" ] && ! [ -d "$old" ]; then
  817.       # Back it up.
  818.       warn "backing up non-directory $old as $old.dpkg-old"
  819.       mv -b "$old" "$old.dpkg-old"
  820.   fi
  821.  
  822.   observe "migrating $old to $new"
  823.  
  824.   # Is new location a symlink?
  825.   if [ -L "$new" ]; then
  826.     # Does it point the wrong way, i.e., back to where we're migrating from?
  827.     if [ "$(readlink "$new")" = "$old" ]; then
  828.       # Get rid of it.
  829.       observe "removing symbolic link $new which points to $old"
  830.       rm "$new"
  831.     else
  832.       # Back it up.
  833.       warn "backing up symbolic link $new as $new.dpkg-old"
  834.       mv -b "$new" "$new.dpkg-old"
  835.     fi
  836.   fi
  837.  
  838.   # Does new location exist, but is not a directory?
  839.   if [ -e "$new" ] && ! [ -d "$new" ]; then
  840.     warn "backing up non-directory $new as $new.dpkg-old"
  841.     mv -b "$new" "$new.dpkg-old"
  842.   fi
  843.  
  844.   # Create new directory if it does not yet exist.
  845.   if ! [ -e "$new" ]; then
  846.     observe "creating $new"
  847.     mkdir -p "$new"
  848.   fi
  849.  
  850.   # Copy files in old location to new location.  Back up any filenames that
  851.   # already exist in the new location with the extension ".dpkg-old".
  852.   observe "copying files from $old to $new"
  853.   if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
  854.     die "error(s) encountered while copying files from $old to $new"
  855.   fi
  856.  
  857.   # Remove files at old location.
  858.   observe "removing $old"
  859.   rm -r "$old"
  860.  
  861.   # Create symlink from old location to new location.
  862.   make_symlink_sane "$old" "$new"
  863. }
  864.  
  865. # vim:set ai et sw=2 ts=2 tw=80:
  866.  
  867. # GOBSTOPPER: The X Strike Force shell library ends here.
  868.  
  869. CONFIG_DIR=/etc/X11
  870. XWRAPPER_CONFIG="$CONFIG_DIR/Xwrapper.config"
  871.  
  872. allowed_users_english_to_actual () {
  873.   case "$1" in
  874.     "Root Only")
  875.       echo "rootonly"
  876.       ;;
  877.     "Console Users Only")
  878.       echo "console"
  879.       ;;
  880.     "Anybody")
  881.       echo "anybody"
  882.       ;;
  883.     *)
  884.       # garbage input; return default
  885.       observe "allowed_users_english_to_actual(): unrecognized input \"$1\";" \
  886.               "using default"
  887.       echo "console"
  888.       ;;
  889.   esac
  890. }
  891.  
  892. allowed_users_actual_to_english () {
  893.   case "$1" in
  894.     "rootonly")
  895.       echo "Root Only"
  896.       ;;
  897.     "console")
  898.       echo "Console Users Only"
  899.       ;;
  900.     "anybody")
  901.       echo "Anybody"
  902.       ;;
  903.     *)
  904.       # garbage input; return default
  905.       observe "allowed_users_actual_to_english(): unrecognized input \"$1\";" \
  906.               "using default"
  907.       echo "Console Users Only"
  908.       ;;
  909.   esac
  910. }
  911.  
  912. CURRENT_ALLOWED_USERS=
  913.  
  914. # scan the X wrapper config file for existing settings, if it exists
  915. if [ -e "$XWRAPPER_CONFIG" ]; then
  916.   if MATCHES=$(grep "^allowed_users=.\+" "$XWRAPPER_CONFIG"); then
  917.     CURRENT_ALLOWED_USERS=$(echo "${MATCHES##*=}" | head -n 1)
  918.   fi
  919. fi
  920.  
  921. if [ -n "$CURRENT_ALLOWED_USERS" ]; then
  922.   observe "setting x11-common/xwrapper/allowed_users from configuration" \
  923.           "file"
  924.   run db_set x11-common/xwrapper/allowed_users \
  925.                       $(allowed_users_actual_to_english \
  926.                       "$CURRENT_ALLOWED_USERS")
  927. fi
  928.  
  929. run db_input low x11-common/xwrapper/allowed_users
  930. run db_go
  931.  
  932. RET=
  933. if db_get x11-common/xwrapper/allowed_users; then
  934.   if [ -n "$RET" ]; then
  935.     run db_set x11-common/xwrapper/actual_allowed_users \
  936.                         $(allowed_users_english_to_actual "$RET")
  937.   fi
  938. fi
  939. exit 0
  940.  
  941. # vim:set ai et sts=2 sw=2 tw=0:
  942.